package com.example.callcenter.rabbitmq;//package com.example.callcenter.rabbitmq;
//
import com.example.callcenter.config.RabbitMQConfig; // 修正引用
import com.example.callcenter.dto.TaskMessageDTO;
import com.example.callcenter.service.ICallTaskService;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.concurrent.CompletableFuture;


///**
// * 任务分发消费者（修正RabbitConfig→RabbitMQConfig引用）
// */
//@Component
//public class TaskDistributeConsumer {
//
//    @Autowired
//    private ICallTaskService callTaskService;
//
//    @RabbitListener(queues = RabbitMQConfig.TASK_QUEUE) // 修正为RabbitMQConfig
//    public void handleTask(TaskMessageDTO message, Channel channel, Message msg) throws IOException {
//        try {
//            // 模拟外呼处理
//            System.out.println("处理外呼任务：" + message.getCustomerName() + "，电话：" + message.getPhone());
//
//            // 处理外呼结果（实际项目中这里会调用外呼API）
//            TaskMessageDTO result = new TaskMessageDTO();
//            result.setTaskId(message.getTaskId());
//            result.setCustomerId(message.getCustomerId());
//            result.setSalesId(message.getSalesId());
//            result.setDuration(120);
//            result.setResult("SUCCESS");
//            result.setRemark("客户有意向");
//
//            callTaskService.processCallResult(result);
//
//            // 手动ACK
//            channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
//        } catch (Exception e) {
//            // 异常处理
//            if (msg.getMessageProperties().getRedelivered()) {
//                channel.basicReject(msg.getMessageProperties().getDeliveryTag(), false);
//            } else {
//                channel.basicNack(msg.getMessageProperties().getDeliveryTag(), false, true);
//            }
//        }
//    }
//}
//@Slf4j
//@Component
//public class TaskDistributeConsumer {
//    @Autowired
//    private ICallTaskService callTaskService;
//
//    @RabbitListener(queues = RabbitMQConfig.TASK_QUEUE)
//    public void handleTask(TaskMessageDTO message, Channel channel, Message msg) throws IOException {
//        long deliveryTag = msg.getMessageProperties().getDeliveryTag();
//        try {
//            // 1. 快速处理，避免长时间阻塞
//            callTaskService.processCallResult(message);
//
//            // 2. 手动ACK（必须执行）
//            channel.basicAck(deliveryTag, false);
//        } catch (Exception e) {
//            // 3. 异常处理（必须执行）
//            if (msg.getMessageProperties().getRedelivered()) {
//                // 已重试过，进入死信队列
//                channel.basicReject(deliveryTag, false);
//                log.error("消息处理失败，进入死信队列", e);
//            } else {
//                // 未重试过，重新入队
//                channel.basicNack(deliveryTag, false,false);
//            }
//        }
//    }
//
//}

@Slf4j
@Component
public class TaskDistributeConsumer {

    @Autowired
    private ICallTaskService callTaskService;

    @RabbitListener(queues = RabbitMQConfig.TASK_QUEUE)
    public void handleTask(TaskMessageDTO message, Channel channel, Message msg) throws IOException {
        log.info("任务Task消费者开始处理任务: {}", message);
        long deliveryTag = msg.getMessageProperties().getDeliveryTag();
        try {
            // 异步处理任务
            CompletableFuture.runAsync(() -> {
                try {

                    // 处理任务
                    callTaskService.processCallResult(message);
                } catch (Exception e) {
                    log.error("处理任务异常", e);
                }
            }).thenAccept(v -> {
                try {

                    // 手动ACK - 成功处理
                    channel.basicAck(deliveryTag, false);
                } catch (IOException e) {
                    log.error("ACK确认失败", e);
                }
            });
        } catch (Exception e) {
            log.error("消息处理异常", e);
            if (msg.getMessageProperties().getRedelivered()) {

                // 已重试过，拒绝并进入死信队列
                channel.basicReject(deliveryTag, false);
                log.error("消息已重试过，进入死信队列，任务ID: {}", message.getTaskId());
            } else {

                // 未重试过，重新入队
                channel.basicNack(deliveryTag, false, true);
                log.info("消息重新入队，任务ID: {}", message.getTaskId());
            }
        }
    }
}